Descendant styles dependent on ancestor state
Example: Sidebar
Consider the case where the content within a sidebar needs to have conditional styles applied when the sidebar as whole is hovered.
Using CSS variables, you can style descendants based on a parent's state, such as :hover
.
Step 1
Define one or more variables using stylex.defineVars
:
// variables.stylex.ts
import * as stylex from '@stylexjs/stylex';
export const vars = stylex.defineVars({
childColor: 'black',
});
Step 2
Define conditional styles setting the value for the variable in the ancestor component.
import * as stylex from '@stylexjs/stylex';
import { vars } from './variables.stylex';
const styles = stylex.create({
parent: {
[vars.childColor]: {
default: 'black',
':hover': 'blue',
},
},
});
function ParentWithHover({children}) {
return (
<div {...stylex.props(styles.parent)}>
{children}
</div>
);
}
Step 3
Use the variable to style the child component
import * as stylex from '@stylexjs/stylex';
import { vars } from './variables.stylex';
const styles = stylex.create({
row: {
color: vars.childColor,
}
});
function ParentWithHover() {
return (
<span {...stylex.props(styles.child)}><Icon />A Row</span>
);
}